package q123_maxProfit;

public class Solution_2 {
    public static void main(String[] args) {

    }

    /**
     * 利用动态规划解决该问题
     * 首先要确认四个状态，买了第一次，卖了第一次，买了第二次，卖了第二次
     * 这之间的关系，就是动态规划的核心
     * 在官方的题解中涉及到了一个概念，就是在同一天买入卖出题干中上是无法实现的，但在实际计算的过程中
     * 我们的算法允许了这一操作，因为该操作并没有影响最后的利润
     * @param prices
     * @return
     */
    public int maxProfit(int[] prices) {
        int n = prices.length;
        int buy1 = prices[0], sell1 = 0;
        int buy2 = prices[0], sell2 = 0;
        for (int i = 1; i < n; ++i) {
            // 前面的两者很好理解，就是某天买入和卖出
            // 我们希望是在最小的时候买入，最大的时候卖出，所以是分别使用min和max
            buy1 = Math.min(buy1, prices[i]);
            sell1 = Math.max(sell1, prices[i] - buy1);

            // 而之后的就是能够理解为如果在这一天立刻卖出买入，并且又卖出
            // 此时能够得到的利润与此前的利润相比较，计算最大值
            buy2 = Math.min(buy2, prices[i] - sell1);
            sell2 = Math.max(sell2, prices[i] - buy2);
        }
        return sell2;

    }
}
